/***************************************************************************
 创建者: 林逢达
 开始时间: 2016.11.28
 copyright: (C) 同川科技
 修改说明: (每次有修改就添加一条，带有 修改人，修改时间，修改描述)

 ***************************************************************************
 *  @file palletcalcute.h
 *  功能:
 *
 *                                                                         *
 ***************************************************************************/
#ifndef PALLETCALCULATE_H
#define PALLETCALCULATE_H

#include "GeneralDefine.h"
#include <QMutex>
//using namespace KDL;

enum E_STACK_TYPE
{
    E_STACK_TYPE_B,
    E_STACK_TYPE_BX,
    E_STACK_TYPE_E,
    E_STACK_TYPE_EX,
    E_STACK_TYPE_F,
};

enum E_STACK_TEACHNUMBER_TYPE
{
    ENUM_STACK_TEACHNUMBER_RCL,  //原点、行点、列点、层点，4个示教点
    ENUM_STACK_TEACHNUMBER_RC,    //原点、行点、列点，3个示教点
    ENUM_STACK_TEACHNUMBER_RL,    //原点、行点、层点，3个示教点
    ENUM_STACK_TEACHNUMBER_CL,   //原点、 列点、层点，3个示教点
    ENUM_STACK_TEACHNUMBER_R,    //原点、行点，2个示教点
    ENUM_STACK_TEACHNUMBER_C,   //原点、 列点，2个示教点
    ENUM_STACK_TEACHNUMBER_L    //原点、 层点，2个示教点
};

//码垛间隔示教类型,2017-3-17 彭秋明添加
enum E_STACK_INTERVAL_TYPE
{
    ENUM_STACK_INTERVAL_NONE,   //非间隔示教
    ENUM_STACK_INTERVAL_ROW,   //指定码垛行间隔示教
    ENUM_STACK_INTERVAL_COL,   //指定码垛列间隔示教
    ENUM_STACK_INTERVAL_LAYER,   //指定码垛层间隔示教
    ENUM_STACK_INTERVAL_RC,   //指定码垛行、列间隔示教
    ENUM_STACK_INTERVAL_RL,   //指定码垛行、层间隔示教
    ENUM_STACK_INTERVAL_CL,   //指定码垛列、层间隔示教
    ENUM_STACK_INTERVAL_RCL  //指定码垛行列层间隔示教
};
// 2017-3-31 彭秋明添加，码垛/拆垛
enum E_STACK_UPDOWN_TYPE
{
    ENUM_STACK_UP,  //码垛
    ENUM_STACK_DOWN  //拆垛
};
// 2017-3-31 彭秋明添加，码垛/拆垛顺序
enum E_STACK_ORDER_STATE
{
    ENUM_STACK_ORDER_RCL,  //行列层顺序
    ENUM_STACK_ORDER_CRL  //列行层顺序
};
// 2017-3-31 彭秋明添加，码垛/拆垛是否完成的状态
enum STACK_WORK_STATE
{
    ENUM_STACK_WORK_DOING,  //码垛
    ENUM_STACK_WORK_FINISH   //拆垛
};



struct RowColLayer
{
    int row;
    int col;
    int layer;
};

class PalletCalculate
{
public:
    PalletCalculate(int robotIdIn, QString configFilePathIn);
    ~PalletCalculate();
    int getPalletConditionInfo(std::vector<struct PalletMiddleInfo> &infoOut);
    int setPalletConditionInfo(struct StackInfo infoIn);

    int getPalletPointData(PalletPoint palletPoint, PointPro &f);
    PalletMiddleInfo getPalletInfoByIndex(int palletIndex);
    int palletCalculateOnce(int palletIndex, int &row, int &col, int &layer);//计算行列层　点位。


private:
    int calculateNextRcl(int palletIndex, int &row, int &col, int &layer);//计算行列层。
    int calculatePalletPointByRcl(int palletIndex, int row, int col, int layer);//计算点位
    int calculatePalletPointByRcl_B(PalletMiddleInfo &tmpMiddleInfo, int row, int col, int layer);//１条路径
    int calculatePalletPointByRcl_F(PalletMiddleInfo &tmpMiddleInfo, int row, int col, int layer);

    int writePalletInfo(QString filePathIn);
    int readConfigFile(QString filePathIn, QString &readComent);


    void addMsg(int messageLevel,
                std::string componentName,
                std::string messageType,
                int messageCode,
                int robotId,
                int parameter1 = 0,
                int parameter2 = 0,
                int parameter3 = 0,
                int parameter4 = 0,
                QString message = "");
private:
    vector<PalletMiddleInfo> palletMiddleInfoList;
    QMutex usingMutex;
    QString configFilePath;
    int robotId;


};

#endif // PALLETCALCULATE_H
